#!/bin/bash

# 关键修复：传递图形环境变量（解决pkexec认证后zenity无法显示的问题）
if [ "$(id -u)" -ne 0 ]; then
    # 检查zenity是否存在
    if ! command -v zenity &> /dev/null; then
        zenity --error --title="依赖缺失" --text="未找到zenity工具，请先安装：\nsudo apt-get install -y zenity" --width=400
        exit 1
    fi
    
    # 显示权限提示
    zenity --info --title="权限要求" --text="此工具需要管理员权限才能运行，\n即将请求您的授权..." --width=400 --height=200
    
    # 传递图形环境变量（关键！确保认证后能显示图形界面）
    pkexec env DISPLAY="$DISPLAY" XAUTHORITY="$XAUTHORITY" "$0" "$@"
    exit $?
fi

# 延迟函数，解决界面切换卡顿
wait_for_zenity() {
    # 等待可能存在的zenity进程结束
    while pgrep zenity >/dev/null; do
        sleep 0.1
    done
    # 短暂延迟确保界面渲染完成
    sleep 0.2
}

# 定义GRUB配置文件路径
GRUB_FILE="/etc/default/grub"
# 定义备份文件路径
BACKUP_DIR="/etc/default/grub_backups"
INITIAL_BACKUP="$BACKUP_DIR/initial_grub_config"

# 创建备份目录（如果不存在）
mkdir -p "$BACKUP_DIR"

# 如果是第一次运行，备份初始配置
if [ ! -f "$INITIAL_BACKUP" ]; then
    cp "$GRUB_FILE" "$INITIAL_BACKUP"
    wait_for_zenity
    zenity --info --title="初始化" --text="已创建初始GRUB配置备份，\n以便后续可以还原设置" --width=400 --height=200
fi

# 获取当前的GRUB_CMDLINE_LINUX_DEFAULT值
CURRENT_SETTING=$(grep -oP 'GRUB_CMDLINE_LINUX_DEFAULT="\K[^"]+' "$GRUB_FILE")

# 定义两种模式的设置和描述
MODE_RUNNING_CODE="text"
MODE_RUNNING_DESC="跑码模式（显示启动代码）"
MODE_LOGO="splash quiet"
MODE_LOGO_DESC="Logo模式（显示Deepin Logo）"

# 确定当前模式描述
if [ "$CURRENT_SETTING" = "$MODE_RUNNING_CODE" ]; then
    CURRENT_MODE="$MODE_RUNNING_DESC"
elif [ "$CURRENT_SETTING" = "$MODE_LOGO" ]; then
    CURRENT_MODE="$MODE_LOGO_DESC"
else
    CURRENT_MODE="自定义模式: $CURRENT_SETTING"
fi

# 显示主界面，让用户选择操作
wait_for_zenity
choice=$(zenity --list \
    --title="Deepin启动界面设置" \
    --text="当前启动模式: $CURRENT_MODE\n\n请选择要执行的操作:" \
    --width=600 \
    --height=400 \
    --radiolist \
    --column="选择" \
    --column="操作" \
    FALSE "切换到$MODE_RUNNING_DESC" \
    FALSE "切换到$MODE_LOGO_DESC" \
    FALSE "还原到初始设置" \
    FALSE "退出")

# 处理用户选择
case "$choice" in
    "切换到$MODE_RUNNING_DESC")
        # 切换到跑码模式
        sed -i "s/GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*\"/GRUB_CMDLINE_LINUX_DEFAULT=\"$MODE_RUNNING_CODE\"/" "$GRUB_FILE"
        
        # 更新GRUB配置，显示进度条
        wait_for_zenity
        zenity --progress \
            --title="更新配置" \
            --text="更新GRUB配置完成" \
            --percentage=0 \
            --width=500 \
            --height=150 < <(
                echo "30"
                sleep 0.3
                update-grub >/dev/null 2>&1
                echo "100"
                sleep 0.2
            )
        
        wait_for_zenity
        zenity --info \
            --title="操作成功" \
            --text="已成功切换到$MODE_RUNNING_DESC！\n下次启动时将生效。" \
            --width=500 \
            --height=200
        ;;
    
    "切换到$MODE_LOGO_DESC")
        # 切换到Logo模式
        sed -i "s/GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*\"/GRUB_CMDLINE_LINUX_DEFAULT=\"$MODE_LOGO\"/" "$GRUB_FILE"
        
        # 更新GRUB配置，显示进度条
        wait_for_zenity
        zenity --progress \
            --title="更新配置" \
            --text="更新GRUB配置完成" \
            --percentage=0 \
            --width=500 \
            --height=150 < <(
                echo "30"
                sleep 0.3
                update-grub >/dev/null 2>&1
                echo "100"
                sleep 0.2
            )
        
        wait_for_zenity
        zenity --info \
            --title="操作成功" \
            --text="已成功切换到$MODE_LOGO_DESC！\n下次启动时将生效。" \
            --width=500 \
            --height=200
        ;;
    
    "还原到初始设置")
        if [ -f "$INITIAL_BACKUP" ]; then
            # 询问确认
            wait_for_zenity
            if zenity --question \
                --title="确认还原" \
                --text="确定要还原到初始配置吗？\n这将恢复到第一次运行此工具时的设置。" \
                --width=500 \
                --height=200 \
                --ok-label="确认" \
                --cancel-label="取消"; then
                
                # 执行还原
                cp "$INITIAL_BACKUP" "$GRUB_FILE"
                
                # 更新GRUB配置，显示进度条
                wait_for_zenity
                zenity --progress \
                    --title="更新配置" \
                    --text="更新GRUB配置完成" \
                    --percentage=0 \
                    --width=500 \
                    --height=150 < <(
                        echo "30"
                        sleep 0.3
                        update-grub >/dev/null 2>&1
                        echo "100"
                        sleep 0.2
                    )
                
                wait_for_zenity
                zenity --info \
                    --title="操作成功" \
                    --text="已成功还原到初始配置！\n下次启动时将生效。" \
                    --width=500 \
                    --height=200
            fi
        else
            wait_for_zenity
            zenity --error \
                --title="错误" \
                --text="未找到初始备份文件，无法还原！" \
                --width=500 \
                --height=200
            exit 1
        fi
        ;;
    
    "退出" | "")
        # 用户选择退出或关闭了窗口
        exit 0
        ;;
    
    *)
        wait_for_zenity
        zenity --error \
            --title="错误" \
            --text="无效的选择，请重试。" \
            --width=500 \
            --height=200
        exit 1
        ;;
esac
